{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Floating point vs Finite Differences"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import numpy.linalg as la\n",
        "import matplotlib.pyplot as pt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Define a function and its derivative:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7f0d292a0cc0>]"
            ]
          },
          "execution_count": 17,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f0d2969fb00>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "c = 20*2*np.pi\n",
        "\n",
        "def f(x):\n",
        "    return np.sin(c*x)\n",
        "\n",
        "def df(x):\n",
        "    return c*np.cos(c*x)\n",
        "\n",
        "n = 2000\n",
        "x = np.linspace(0, 1, n, endpoint=False).astype(np.float32)\n",
        "\n",
        "pt.plot(x, f(x))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Now compute the relative $l^\\infty$ norm of the error in the finite differences, for a bunch of mesh sizes:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {
        "collapsed": false
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "0.03125 4.8089\n",
            "0.015625 1.24653\n",
            "0.0078125 0.314495\n",
            "0.00390625 0.0789223\n",
            "0.001953125 0.0200939\n",
            "0.0009765625 0.00580978\n",
            "0.00048828125 0.003088\n",
            "0.000244140625 0.00217628\n",
            "0.0001220703125 0.00588608\n",
            "6.103515625e-05 0.0104866\n",
            "3.0517578125e-05 0.0216255\n",
            "1.52587890625e-05 0.0410156\n",
            "7.62939453125e-06 0.0843182\n",
            "3.814697265625e-06 0.166426\n",
            "1.9073486328125e-06 0.416862\n",
            "9.5367431640625e-07 0.586523\n",
            "4.76837158203125e-07 1.42031\n",
            "2.384185791015625e-07 3.42323\n",
            "1.1920928955078125e-07 7.42658\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "[<matplotlib.lines.Line2D at 0x7f0d295ce908>]"
            ]
          },
          "execution_count": 16,
          "metadata": {},
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7f0d295eb9b0>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "h_values = []\n",
        "err_values = []\n",
        "\n",
        "for n_exp in range(5, 24):\n",
        "    n = 2**n_exp\n",
        "    h = (1/n)\n",
        "\n",
        "    x = np.linspace(0, 1, n, endpoint=False).astype(np.float32)\n",
        "\n",
        "    fx = f(x)\n",
        "    dfx = df(x)\n",
        "\n",
        "    dfx_num = (np.roll(fx, -1) - np.roll(fx, 1)) / (2*h)\n",
        "\n",
        "    err = np.max(np.abs((dfx - dfx_num))) / np.max(np.abs(fx))\n",
        "\n",
        "    print(h, err)\n",
        "\n",
        "    h_values.append(h)\n",
        "    err_values.append(err)\n",
        "\n",
        "pt.rc(\"font\", size=16)\n",
        "pt.title(r\"Single precision FD error on $\\sin(20\\cdot 2\\pi)$\")\n",
        "pt.xlabel(r\"$h$\")\n",
        "pt.ylabel(r\"Rel. Error\")\n",
        "pt.loglog(h_values, err_values)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.5.1+"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}